home *** CD-ROM | disk | FTP | other *** search
Wrap
/* MM_PGPManager 1995 by Sebastian Bleikamp ... V. 0.8 This program is free to everyone ! USE IT AT YOUR OWN RISC !!! Neu seit Version 0.1: + Globale Variablennamen geändert. + -> GetKeys : Fügt alle Keys aus einer Message zum Public-Key Ring dazu. (Wenn es der User bestaetigt... ) + -> Save : Entschlüsselt eine Nachricht und speichert sie dann als Klartext in die Msg.-Base. Neu seit Version 0.2: + E-Mails werden erkannt, und die Adressierung berücksichtigt. Dazu wurden 2 Funktionen geschrieben: Get_MM_Msg und Edit_MM_Msg. Sie lesen (wenn vorhanden) die E-Mail Adresse aus und schreiben sie nacher wieder als 1. Zeile in die Msg. Neu seit Version 0.3: + Es gibt jetzt 2 Funktionen zum Verschluesseln der Messages: Einmal wird die Message nur verschluesselt (WRITE) und bei der anderen zusätzlich noch unterschrieben (WRITES) + Alle Texte jetzt in Englisch (außer den Docs ...) + Endlich: Jetzt mit Doks !!! Neu seit Version 0.4: + Funktion PUTFILE: Verschlüsselt ein File (auch binär) und hängt es im ASCII Format an eine Message an. + Funktion GETFILE: Speichert den Plaintext einer Message in ein File. Sehr nützlich, wenn man verschlüsselte Binärfiles empfängt. Neu seit Version 0.5 (nicht veröffentlicht): + Jetzt mit Requester, der die Public-Keys auflistet. Wenn Abbruch eingegeben wird, kann man die User-ID per Hand eingeben. + Jetzt mit GUI. Einfach spitze !!! + Jetzt mit Sicherheitsabfrage, wenn Messages bereits gesendet wurden, importiert oder geschützt sind. Neu seit Version 0.6 (nicht veröffentlicht): + Bug in der Funktion für die Public-Keyliste entfernt. Routine optimiert. + Remove: Beseitigt die Signature vom File, funktioniert wie SAVE. + Jetzt mit Verschlüsseln für mehrere User !!! Neu seit Version 0.7: + Bessere Konfiguration. + Einige Bugs beseitigt, läuft jetzt zuverlässiger. (Hoffentlich ...) */ ADDRESS 'MAILMANAGER' PARSE ARG system.area system.msg system.funk /* Configuration */ /*---------------------------------------------------------------------------*/ /* Die PGP Befehle: Am besten nur die Pfade und die CON: verändern ! Meine Empfehlung für CON: CON:0/11/-1/245/PGP/SCREEN<MailManagerScreen> */ system.pgp.read = 'PGP <>CON: -m' system.pgp.write = 'PGP <>CON: -eat' system.pgp.write_sign = 'PGP <>CON: -seat' system.pgp.sign = 'PGP <>CON: -sat' system.pgp.keyadd = 'PGP <>CON: -kxat' system.pgp.getkeys = 'PGP <>CON: -ka' system.pgp.save = 'PGP <>CON: -d' system.pgp.getfile = 'PGP <>CON: -p' system.pgp.putfile = 'PGP <>CON: -ea' system.pgp.remove = 'PGP <>CON: -b' system.pgp.listkeys = 'PGP -kv' /* Don´t use a <>CON: here !!! */ system.sysopid = 'It´s me !!!' /* Your id in PGP´s secret ring */ system.output = 'T:Output' system.tempfile = 'T:MM_PGPM.tmp' /*-----------------------------------------------------------------------*/ /* Init: */ /*-----------------------------------------------------------------------*/ system.output.asc = system.output||'.asc' system.output.sig = system.output||'.sig' list.count=0 /*-----------------------------------------------------------------------*/ /* Main: */ /*-----------------------------------------------------------------------*/ if system.funk='GUI' | system.funk='' then system.leave=0 else system.leave=1 Main: do while system.leave~=2 if system.leave=0 then do system.funk='' call Get_Mode end else system.leave=2 SELECT WHEN UPPER(system.funk)='READ' THEN CALL PGP_Read WHEN UPPER(system.funk)='WRITE' THEN CALL PGP_Write WHEN UPPER(system.funk)='WRITES' THEN CALL PGP_Write_Sign WHEN UPPER(system.funk)='SIGN' THEN CALL PGP_Sign WHEN UPPER(system.funk)='KEYADD' THEN CALL PGP_Keyadd WHEN UPPER(system.funk)='GETKEYS' THEN CALL PGP_GetKeys WHEN UPPER(system.funk)='SAVE' THEN CALL PGP_Save WHEN UPPER(system.funk)='GETFILE' THEN CALL PGP_GetFile WHEN UPPER(system.funk)='PUTFILE' THEN CALL PGP_PutFile WHEN UPPER(system.funk)='REMOVE' THEN CALL PGP_Remove WHEN UPPER(system.funk)='HELP' THEN CALL Prog_Help OTHERWISE CALL Prog_Help END end exit return /*-----------------------------------------------------------------------*/ /* Read / Write Functions: */ /*-----------------------------------------------------------------------*/ PGP_Read: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit MM_WriteStem system.tempfile MSG_Stem.TEXT ADDRESS command system.pgp.read||' '|| system.tempfile MM_DeleteFile system.tempfile RETURN PGP_Write: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit REQTEXT=' Area: '||system.area||'0a'X ||' Msg.: '||system.msg||'0a'X ||'0a'X ||' Subj: '||MSG_Stem.Subj||'0a'X ||'0a'X ||'0a'X ||' From: '||MSG_Stem.From||'0a'X ||' ('||MSG_Stem.Fromaddr||')'||'0a'X ||'0a'X ||' To: '||MSG_Stem.To||'0a'X ||' ('||MSG_Stem.Toaddr||')'||'0a'X ||'0a'X ||'0a'X ||' Do you want to encrypt this message ? ' ; GADGETS='* _Yes | _No ' MM_Requester '"MM_PGPManager: Write"' 'REQTEXT' 'GADGETS' IF RC~=1 THEN return call Check_Write user = MSG_Stem.TO call Get_Multi_User CALL Get_MM_Msg ADDRESS COMMAND system.pgp.write||' -o '||system.output||' '||system.tempfile || ' ' ||user CALL Edit_MM_Msg MM_EditMsg system.area system.msg 'MSG_Stem' MM_DeleteFile system.tempfile MM_DeleteFile system.output.asc RETURN PGP_Write_Sign: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit REQTEXT=' Area: '||system.area||'0a'X ||' Msg.: '||system.msg||'0a'X ||'0a'X ||' Subj: '||MSG_Stem.Subj||'0a'X ||'0a'X ||'0a'X ||' From: '||MSG_Stem.From||'0a'X ||' ('||MSG_Stem.Fromaddr||')'||'0a'X ||'0a'X ||' To: '||MSG_Stem.To||'0a'X ||' ('||MSG_Stem.Toaddr||')'||'0a'X ||'0a'X ||'0a'X ||' Do you really want to sign and encrypt this msg. ? ' ; GADGETS='* _Yes | _No ' MM_Requester '"MM_PGPManager: Write & Sign"' 'REQTEXT' 'GADGETS' IF RC~=1 THEN return call Check_Write REQTEXT= '"Please enter the sysop´s user id:"' MM_StringReq REQTEXT 'system.sysopid' if rc~=0 then return user = MSG_Stem.TO call Get_Multi_User CALL Get_MM_Msg ADDRESS COMMAND system.pgp.write_sign||' -o '||system.output||' -u "'||system.sysopid||'" '||system.tempfile||' '||user CALL Edit_MM_Msg MM_EditMsg system.area system.msg 'MSG_Stem' MM_DeleteFile system.tempfile MM_DeleteFile system.output.asc RETURN PGP_Sign: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit REQTEXT=' Area: '||system.area||'0a'X ||' Msg.: '||system.msg||'0a'X ||'0a'X ||' Subj: '||MSG_Stem.Subj||'0a'X ||'0a'X ||'0a'X ||' From: '||MSG_Stem.From||'0a'X ||' ('||MSG_Stem.Fromaddr||')'||'0a'X ||'0a'X ||' To: '||MSG_Stem.To||'0a'X ||' ('||MSG_Stem.Toaddr||')'||'0a'X ||'0a'X ||'0a'X ||' Do you really want to sign this message ? ' ; GADGETS='* _Yes | _No ' MM_Requester '"MM_PGPManager: Sign"' 'REQTEXT' 'GADGETS' IF RC~=1 THEN return call Check_Write REQTEXT= '"Please enter the sysop´s user id:"' MM_StringReq REQTEXT 'system.sysopid' if RC~=0 then return CALL Get_MM_Msg ADDRESS command system.pgp.sign||' -o '||system.output||' -u "'||system.sysopid||'" '||system.tempfile CALL Edit_MM_Msg MM_EditMsg system.area system.msg 'MSG_Stem' MM_DeleteFile system.tempfile MM_DeleteFile system.output.asc RETURN PGP_Keyadd: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit REQTEXT=' Area: '||system.area||'0a'X ||' Msg.: '||system.msg||'0a'X ||'0a'X ||' Subj: '||MSG_Stem.Subj||'0a'X ||'0a'X ||'0a'X ||' From: '||MSG_Stem.From||'0a'X ||' ('||MSG_Stem.Fromaddr||')'||'0a'X ||'0a'X ||' To: '||MSG_Stem.To||'0a'X ||' ('||MSG_Stem.Toaddr||')'||'0a'X ||'0a'X ||'0a'X ||' Do you really want to add a keyfile ? ' ; GADGETS='* _Yes | _No ' MM_Requester '"MM_PGPManager: Add Key"' 'REQTEXT' 'GADGETS' IF RC~=1 THEN return call Check_Write user = system.sysopid call Get_User ADDRESS command system.pgp.keyadd||' '||user||' '||system.output MM_ReadStem system.output.asc 'MSG_Stem.TEXT' 'APPEND' MM_WriteStem system.tempfile 'MSG_Stem.TEXT' MSG_Stem.FILE = system.tempfile MM_EditMsg system.area system.msg 'MSG_Stem' MM_DeleteFile system.tempfile MM_DeleteFile system.output.asc RETURN PGP_GetKeys: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit MM_WriteStem system.tempfile MSG_Stem.TEXT ADDRESS command system.pgp.getkeys||' '||system.tempfile MM_DeleteFile system.tempfile RETURN PGP_Save: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit REQTEXT=' Area: '||system.area||'0a'X ||' Msg.: '||system.msg||'0a'X ||'0a'X ||' Subj: '||MSG_Stem.Subj||'0a'X ||'0a'X ||'0a'X ||' From: '||MSG_Stem.From||'0a'X ||' ('||MSG_Stem.Fromaddr||')'||'0a'X ||'0a'X ||' To: '||MSG_Stem.To||'0a'X ||' ('||MSG_Stem.Toaddr||')'||'0a'X ||'0a'X ||'0a'X ||' Do you really want to save the plaintext ? '||'0a'X ||' (Orig. msg gets lost!) ' ; GADGETS=' _Yes |* _No ' MM_Requester '"MM_PGPManager: Save"' 'REQTEXT' 'GADGETS' IF RC~=1 THEN return if find(MSG_Stem.FLAGS, 'SAFE')~=0 then do REQTEXT=' WARNING:'||'0a'X ||'0a'X ||' The message is protected. ' ; GADGETS='* _Continue | _Ooops !!! ' MM_Requester 'MM_PGPManager' 'REQTEXT' 'GADGETS' IF RC~=1 THEN return end MM_WriteStem system.tempfile MSG_Stem.TEXT ADDRESS command system.pgp.save||' -o '||system.output.asc||' '||system.tempfile MSG_Stem.FILE = system.output.asc MM_EditMsg system.area system.msg 'MSG_Stem' MM_DeleteFile system.tempfile MM_DeleteFile system.output.asc RETURN PGP_GetFile: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit MM_WriteStem system.tempfile MSG_Stem.TEXT outfile=system.output MM_FileReq 'outfile' ; if rc=1 then return ADDRESS command system.pgp.getfile||' -o '||outfile||' '||system.tempfile MM_DeleteFile system.tempfile RETURN PGP_PutFile: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit REQTEXT=' Area: '||system.area||'0a'X ||' Msg.: '||system.msg||'0a'X ||'0a'X ||' Subj: '||MSG_Stem.Subj||'0a'X ||'0a'X ||'0a'X ||' From: '||MSG_Stem.From||'0a'X ||' ('||MSG_Stem.Fromaddr||')'||'0a'X ||'0a'X ||' To: '||MSG_Stem.To||'0a'X ||' ('||MSG_Stem.Toaddr||')'||'0a'X ||'0a'X ||'0a'X ||' Do you want to encrypt and append a file ? ' ; GADGETS='* _Yes | _No ' MM_Requester '"MM_PGPManager: Put File"' 'REQTEXT' 'GADGETS' IF RC~=1 THEN return call Check_Write infile='RAM:' MM_FileReq 'infile' ; if rc=1 then return user = MSG_Stem.TO call Get_Multi_User ADDRESS command system.pgp.putfile||' -o '||system.output||' '||infile||' '||user MM_ReadStem system.output.asc 'MSG_Stem.TEXT' 'APPEND' MM_WriteStem system.tempfile 'MSG_Stem.TEXT' MSG_Stem.FILE = system.tempfile MM_EditMsg system.area system.msg 'MSG_Stem' MM_DeleteFile system.tempfile MM_DeleteFile system.output.asc RETURN PGP_Remove: drop MSG_Stem. MM_ReadMsg system.area system.msg 'MSG_Stem' ; IF RC~=0 THEN exit MM_WriteStem system.tempfile MSG_Stem.TEXT ADDRESS command system.pgp.remove||' -o '||system.output.asc||' '||system.tempfile REQTEXT=' Do you want to write the message to the message base ? '||'0a'X ||'0a'X ||' The signature has been removed.'||'0a'X ||'0a'X ||' WARNING: Orig. message gets lost !' GADGETS=' _Yes |* _No ' MM_Requester '"MM_PGPManager: Remove"' 'REQTEXT' 'GADGETS' IF RC=1 THEN do if find(MSG_Stem.FLAGS, 'SAFE')~=0 then do REQTEXT=' WARNING:'||'0a'X ||'0a'X ||' The message is protected. ' ; GADGETS='* _Continue | _Ooops !!! ' MM_Requester 'MM_PGPManager' 'REQTEXT' 'GADGETS' IF RC~=1 THEN return end MSG_Stem.FILE = system.output.asc MM_EditMsg system.area system.msg 'MSG_Stem' MM_DeleteFile system.tempfile MM_DeleteFile system.output.asc end else do outfile='RAM:Message.asc' MM_FileReq 'outfile' MM_MoveFile system.output.asc outfile end REQTEXT=' The Signature is saved in a file. '||'0a'X ||'0a'X ||' Do you want to delete it ? ' GADGETS='* _Yes | _No ' MM_Requester '"MM_PGPManager: Remove"' 'REQTEXT' 'GADGETS' IF RC=1 THEN MM_DeleteFile system.output.sig else do outfile='RAM:Message.sig' MM_FileReq 'outfile' MM_MoveFile system.output.sig outfile end return /*-----------------------------------------------------------------------*/ /* Misc Functions & Subroutines: */ /*-----------------------------------------------------------------------*/ Get_MM_Msg: IF ( UPPER(Word( MSG_Stem.TEXT.0, 1)) = 'TO:' ) THEN DO system.email = MSG_Stem.TEXT.0 DO i = 2 TO MSG_Stem.TEXT.COUNT-1 j = i - 2 text.j = MSG_Stem.TEXT.i END text.count = MSG_Stem.TEXT.COUNT-2 MM_WriteStem system.tempfile 'text' END ELSE DO system.email = '' MM_WriteStem system.tempfile 'MSG_Stem.TEXT' END RETURN Edit_MM_Msg: IF system.email='' THEN DO MSG_Stem.FILE = system.output.asc END ELSE DO text.count=2 text.0 = system.email text.1 = '' MM_ReadStem system.output.asc 'text' 'APPEND' MM_WriteStem system.tempfile 'text' MSG_Stem.FILE= system.tempfile END RETURN Get_User: call Read_List dummy.count=0 REQTEXT= '"Please enter the user id of the public key:"' MM_SingleSelReq 'list' 'dummy' REQTEXT 'STR' if rc=0 then do user='' user=dummy.0 end else do REQTEXT= '"Please enter the user id of the public key:"' MM_StringReq REQTEXT 'user' ; if rc~=0 then exit end user= '"'||user||'"' return Get_Multi_User: call Read_List dummy.count=0 REQTEXT= '"Please enter the user id of the public key:"' MM_MultiSelReq 'list' 'dummy' REQTEXT 'STR' if rc=0 then do user='' do x=0 to dummy.count-1 user= user||'"'||dummy.x||'" ' end end else do REQTEXT= '"Please enter the user id of the public key:"' MM_StringReq REQTEXT 'user' ; if rc~=0 then exit user='"'||user|'"' end return Read_List: dummy.count=0 if list.count=0 then do address command system.pgp.listkeys||' >'||system.tempfile MM_ReadStem system.tempfile 'dummy' do x=0 to dummy.count-1 parse var dummy.x 'pub ' . ' ' . ' ' name if name~='' then do y=list.count; list.y=name; list.count=y+1; end end end return Check_Write: if find(MSG_Stem.FLAGS, 'SENT')~=0 | find(MSG_Stem.FLAGS, 'IMP')~=0 | find(MSG_Stem.FLAGS, 'SAFE')~=0 then do REQTEXT=' WARNING:'||'0a'X ||'0a'X ||' The message is protected, imported or already sent. ' ; GADGETS='* _Continue | _Ooops !!! ' MM_Requester 'MM_PGPManager' 'REQTEXT' 'GADGETS' IF RC=0 THEN exit end return Get_Mode: do while system.funk='' reqtext=' Please select a mode: ' reqgadgets='* _Read | _Write | _Help | _Quit ' MM_Requester '"MM_PGPManager: Main Menu"' 'reqtext' 'reqgadgets' mode=rc select when mode=1 then call Get_Mode_Read when mode=2 then call Get_Mode_Write when mode=3 then call Prog_Help otherwise exit end end return Get_Mode_Read: reqtext=' Please select a function: ' reqgadgets='* _Read | Get _File | _Get Keys | _Save |_Remove Sig.| _Back ' MM_Requester '"MM_PGPManager: Read"' 'reqtext' 'reqgadgets' func=rc select when func=1 then system.funk='READ' when func=2 then system.funk='GETFILE' when func=3 then system.funk='GETKEYS' when func=4 then system.funk='SAVE' when func=5 then system.funk='REMOVE' otherwise return end return Get_Mode_Write: reqtext=' Please select a function: ' reqgadgets=' _Write | _Sign |W_rite&Sign|_Put File|_Add Key|* _Back ' MM_Requester '"MM_PGPManager: Write"' 'reqtext' 'reqgadgets' func=rc select when func=1 then system.funk='WRITE' when func=2 then system.funk='SIGN' when func=3 then system.funk='WRITES' when func=4 then system.funk='PUTFILE' when func=5 then system.funk='KEYADD' otherwise return end return /*-----------------------------------------------------------------------*/ /* Help: */ /*-----------------------------------------------------------------------*/ Prog_Help: mydummy=0 do while mydummy=0 reqtext=' MM_PGPManager'||'0a'X ||'0a'X ||' Version 0.8'||'0a'X ||'0a'X ||'1996 by Sebastian Bleikamp'||'0a'X ||'0a'X ||'0a'X ||'Please choose the topic:' reqgadgets=' _Read | _Write |* _Back ' MM_Requester '"MM_PGPManager: Help"' 'reqtext' 'reqgadgets' mode=rc select when mode=1 then call read_help when mode=2 then call write_help otherwise mydummy=1 end end return read_help: reqtext='Read - Decrypt and read a message'||'0a'X ||' using PGP´s viewer.'||'0a'X ||'0a'X ||'Get File - Write decrypted message to a file.'||'0a'X ||' Useful for receiving binary files.'||'0a'X ||'0a'X ||'Get Keys - Get all keys out of a message'||'0a'X ||' reading it.'||'0a'X ||'0a'X ||'Save - Save the plaintext of the message'||'0a'X ||' to the message base.'||'0a'X ||' Encrypted msg. will be killed !'||'0a'X ||'0a'X ||'Remove - Removes signatures from message.'||'0a'X ||' (Message will be decrypted,'||'0a'X ||' orig. message gets lost !)' reqgadgets='*_Back to the help menu.' MM_Requester '"MM_PGPManager: Help - Read"' 'reqtext' 'reqgadgets' return write_help: reqtext='Write - Encrypt the current message.'||'0a'X ||'0a'X ||'Sign - Sign the current message.'||'0a'X ||'0a'X ||'Write & Sign - Encrypt and sign the current'||'0a'X ||' message.'||'0a'X ||'0a'X ||'Put File - Encrypt a file, including binary'||'0a'X ||' files, and append it to the'||'0a'X ||' current message.'||'0a'X ||'0a'X ||'Add Key - Add a public key from the pubring'||'0a'X ||' to the message.' reqgadgets='*_Back to the help menu.' MM_Requester '"MM_PGPManager: Help - Write"' 'reqtext' 'reqgadgets' return